package mastermind.gui.controls;

import java.util.ArrayList;

import mastermind.img.ImageLoader;

import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;

/**
 * Diese Klasse stellt einen Rate-Pin dar
 */
public class PinUI extends Canvas
{
	private Image							_img;
	private byte							_color;
	private ArrayList<SelectionListener>	_listener;
	private boolean							_isSelected;

	/**
	 * Erstellt ein neues PinUI Objekt
	 * 
	 * @param parent
	 *            Eltern-Objekt, auf das das PinUI Objekt plaziert wird
	 * @param style
	 *            Zus&auml;zliche Style Informationen
	 */
	public PinUI(Composite parent, int style)
	{
		super(parent, style);
		_listener = new ArrayList<SelectionListener>();
		this.addPaintListener(new PaintListener() {

			@Override
			public void paintControl(PaintEvent e)
			{
				if (_img != null)
					e.gc.drawImage(_img, 0, 1);
				if (_isSelected)
					e.gc.drawImage(ImageLoader.getSelected(), 0, 0);
			}
		});
		this.addMouseListener(new MouseListener() {

			@Override
			public void mouseUp(MouseEvent e)
			{
				if (e.x >= 0 && e.y >= 0 && e.x <= getBounds().width && e.y <= getBounds().height)
				{
					clicked(e);
				}
			}

			@Override
			public void mouseDown(MouseEvent e)
			{}

			@Override
			public void mouseDoubleClick(MouseEvent e)
			{}
		});
		this.setLayoutData(new RowData(24, 24));

	}

	/**
	 * Benachrichtigt alle Listener &uuml;ber ein Klick Ereignis
	 * 
	 * @param e
	 *            MouseEvent
	 */
	protected void clicked(MouseEvent e)
	{
		Event ev = new Event();
		ev.x = e.x;
		ev.y = e.y;
		ev.widget = this;
		for (SelectionListener sel : _listener)
		{
			sel.widgetSelected(new SelectionEvent(ev));
		}
	}

	/**
	 * Setzt eine bestimmte Farbe
	 * 
	 * @param color
	 *            Anzuzeigende Farbe
	 */
	public void setColor(byte color)
	{
		_img = ImageLoader.getPin(color);

		this.setLayoutData(new RowData(_img.getBounds().width, _img.getBounds().height));

		this._color = color;

		this.redraw();
	}

	/**
	 * Gibt die angezeigte Farbe zur&uuml;ck
	 * 
	 * @return Angezeigt Farbe
	 */
	public byte getColor()
	{
		return _color;
	}

	/**
	 * Einen SelectionAdapter zur Liste hinzuf&uuml;gen, um bei einem Klick
	 * Ereignis benachrichtigt zu werden.
	 * 
	 * @param sel
	 *            SelectionAdapter der auf den Klick reagieren soll
	 */
	public void addSelectionListener(SelectionListener sel)
	{
		_listener.add(sel);
	}

	/**
	 * Gibt zur&uuml;ck, ob dieser Pin gerade ausgew&auml;hlt ist
	 * 
	 * @return <code>true</code>, wenn ausgew&auml;hlt<br>
	 *         <code>false</code> sonst
	 */
	public boolean getSelected()
	{
		return _isSelected;
	}

	/**
	 * Setzt ob der Pin ausgew&auml;hlt ist
	 * 
	 * @param state
	 * <br/>
	 *            <code>true</code>, wenn ausgew&auml;hlt<br>
	 *            <code>false</code> sonst
	 */
	public void setSelected(boolean state)
	{
		_isSelected = state;
		redraw();
	}
}
